home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-12-20 | 13.3 KB | 394 lines | [TEXT/CWIE] |
- #include "ocheaders.h"
- #include "FnAssert.h"
- #include "C3DView.h"
-
-
- //------------------------------------------------------------------------------
- // Static members
- //------------------------------------------------------------------------------
-
- RGBColor C3DView::gColor [ kDefaultNumberOf3DViewStates ] [ kDefaultNumberOf3DViewParts ];
-
- const Boolean kIsDeep = true;
- const Boolean kIsNotDeep = false;
-
- const Boolean kIsDepressed = true;
- const Boolean kIsNotDepressed = false;
-
- void SetRGBColor(const RGBColor * srcColor, RGBColor * destColor);
- void SetRGBColor(const RGBColor * srcColor, RGBColor * destColor)
- {
- destColor->red = srcColor->red;
- destColor->green = srcColor->green;
- destColor->blue = srcColor->blue;
- }
-
- //------------------------------------------------------------------------------
- // Initialization
- //------------------------------------------------------------------------------
-
- void InitU3DView(void)
- {
- // Set up static array for default color handling.
-
- C3DView::gColor [ rstNominal ] [ rptOutsideUpperLeft ].red = 0xDDDD;
- C3DView::gColor [ rstNominal ] [ rptOutsideUpperLeft ].green = 0xDDDD;
- C3DView::gColor [ rstNominal ] [ rptOutsideUpperLeft ].blue = 0xDDDD;
-
- C3DView::gColor [ rstNominal ] [ rptInsideUpperLeft ].red = 0xBBBB;
- C3DView::gColor [ rstNominal ] [ rptInsideUpperLeft ].green = 0xBBBB;
- C3DView::gColor [ rstNominal ] [ rptInsideUpperLeft ].blue = 0xBBBB;
-
- C3DView::gColor [ rstNominal ] [ rptFill ].red = 0xAAAA;
- C3DView::gColor [ rstNominal ] [ rptFill ].green = 0xAAAA;
- C3DView::gColor [ rstNominal ] [ rptFill ].blue = 0xAAAA;
-
- C3DView::gColor [ rstNominal ] [ rptInsideLowerRight ].red = 0x8888;
- C3DView::gColor [ rstNominal ] [ rptInsideLowerRight ].green = 0x8888;
- C3DView::gColor [ rstNominal ] [ rptInsideLowerRight ].blue = 0x8888;
-
- C3DView::gColor [ rstNominal ] [ rptMiddleLowerRight ].red = 0x5555;
- C3DView::gColor [ rstNominal ] [ rptMiddleLowerRight ].green = 0x5555;
- C3DView::gColor [ rstNominal ] [ rptMiddleLowerRight ].blue = 0x5555;
-
- C3DView::gColor [ rstNominal ] [ rptOutsideLowerRight ].red = 0x2222;
- C3DView::gColor [ rstNominal ] [ rptOutsideLowerRight ].green = 0x2222;
- C3DView::gColor [ rstNominal ] [ rptOutsideLowerRight ].blue = 0x2222;
-
-
- C3DView::gColor [ rstRed ] [ rptOutsideUpperLeft ].red = 0xFFFF;
- C3DView::gColor [ rstRed ] [ rptOutsideUpperLeft ].green = 0xCCCC;
- C3DView::gColor [ rstRed ] [ rptOutsideUpperLeft ].blue = 0xCCCC;
-
- C3DView::gColor [ rstRed ] [ rptInsideUpperLeft ].red = 0xFFFF;
- C3DView::gColor [ rstRed ] [ rptInsideUpperLeft ].green = 0x9999;
- C3DView::gColor [ rstRed ] [ rptInsideUpperLeft ].blue = 0x9999;
-
- C3DView::gColor [ rstRed ] [ rptFill ].red = 0xFFFF;
- C3DView::gColor [ rstRed ] [ rptFill ].green = 0x9999;
- C3DView::gColor [ rstRed ] [ rptFill ].blue = 0x9999;
-
- C3DView::gColor [ rstRed ] [ rptInsideLowerRight ].red = 0xFFFF;
- C3DView::gColor [ rstRed ] [ rptInsideLowerRight ].green = 0x6666;
- C3DView::gColor [ rstRed ] [ rptInsideLowerRight ].blue = 0x6666;
-
- C3DView::gColor [ rstRed ] [ rptMiddleLowerRight ].red = 0xFFFF;
- C3DView::gColor [ rstRed ] [ rptMiddleLowerRight ].green = 0x3333;
- C3DView::gColor [ rstRed ] [ rptMiddleLowerRight ].blue = 0x3333;
-
- C3DView::gColor [ rstRed ] [ rptOutsideLowerRight ].red = 0x6666;
- C3DView::gColor [ rstRed ] [ rptOutsideLowerRight ].green = 0x0000;
- C3DView::gColor [ rstRed ] [ rptOutsideLowerRight ].blue = 0x0000;
-
-
- C3DView::gColor [ rstGreen ] [ rptOutsideUpperLeft ].red = 0xCCCC;
- C3DView::gColor [ rstGreen ] [ rptOutsideUpperLeft ].green = 0xFFFF;
- C3DView::gColor [ rstGreen ] [ rptOutsideUpperLeft ].blue = 0xCCCC;
-
- C3DView::gColor [ rstGreen ] [ rptInsideUpperLeft ].red = 0x9999;
- C3DView::gColor [ rstGreen ] [ rptInsideUpperLeft ].green = 0xCCCC;
- C3DView::gColor [ rstGreen ] [ rptInsideUpperLeft ].blue = 0x9999;
-
- C3DView::gColor [ rstGreen ] [ rptFill ].red = 0x9999;
- C3DView::gColor [ rstGreen ] [ rptFill ].green = 0xCCCC;
- C3DView::gColor [ rstGreen ] [ rptFill ].blue = 0x9999;
-
- C3DView::gColor [ rstGreen ] [ rptInsideLowerRight ].red = 0x6666;
- C3DView::gColor [ rstGreen ] [ rptInsideLowerRight ].green = 0x9999;
- C3DView::gColor [ rstGreen ] [ rptInsideLowerRight ].blue = 0x6666;
-
- C3DView::gColor [ rstGreen ] [ rptMiddleLowerRight ].red = 0x3333;
- C3DView::gColor [ rstGreen ] [ rptMiddleLowerRight ].green = 0x6666;
- C3DView::gColor [ rstGreen ] [ rptMiddleLowerRight ].blue = 0x3333;
-
- C3DView::gColor [ rstGreen ] [ rptOutsideLowerRight ].red = 0x0000;
- C3DView::gColor [ rstGreen ] [ rptOutsideLowerRight ].green = 0x3333;
- C3DView::gColor [ rstGreen ] [ rptOutsideLowerRight ].blue = 0x0000;
-
-
- C3DView::gColor [ rstDepressed ] [ rptOutsideUpperLeft ].red = 0x3333;
- C3DView::gColor [ rstDepressed ] [ rptOutsideUpperLeft ].green = 0x3333;
- C3DView::gColor [ rstDepressed ] [ rptOutsideUpperLeft ].blue = 0x3333;
-
- C3DView::gColor [ rstDepressed ] [ rptInsideUpperLeft ].red = 0xDDDD;
- C3DView::gColor [ rstDepressed ] [ rptInsideUpperLeft ].green = 0xDDDD;
- C3DView::gColor [ rstDepressed ] [ rptInsideUpperLeft ].blue = 0xDDDD;
-
- C3DView::gColor [ rstDepressed ] [ rptFill ].red = 0xAAAA;
- C3DView::gColor [ rstDepressed ] [ rptFill ].green = 0xAAAA;
- C3DView::gColor [ rstDepressed ] [ rptFill ].blue = 0xAAAA;
-
- C3DView::gColor [ rstDepressed ] [ rptInsideLowerRight ].red = 0xAAAA;
- C3DView::gColor [ rstDepressed ] [ rptInsideLowerRight ].green = 0xAAAA;
- C3DView::gColor [ rstDepressed ] [ rptInsideLowerRight ].blue = 0xAAAA;
-
- C3DView::gColor [ rstDepressed ] [ rptMiddleLowerRight ].red = 0x8888;
- C3DView::gColor [ rstDepressed ] [ rptMiddleLowerRight ].green = 0x8888;
- C3DView::gColor [ rstDepressed ] [ rptMiddleLowerRight ].blue = 0x8888;
-
- C3DView::gColor [ rstDepressed ] [ rptOutsideLowerRight ].red = 0x5555;
- C3DView::gColor [ rstDepressed ] [ rptOutsideLowerRight ].green = 0x5555;
- C3DView::gColor [ rstDepressed ] [ rptOutsideLowerRight ].blue = 0x5555;
-
-
- C3DView::gColor [ rstDepressedWhite ] [ rptOutsideUpperLeft ].red = 0x5555;
- C3DView::gColor [ rstDepressedWhite ] [ rptOutsideUpperLeft ].green = 0x5555;
- C3DView::gColor [ rstDepressedWhite ] [ rptOutsideUpperLeft ].blue = 0x5555;
-
- C3DView::gColor [ rstDepressedWhite ] [ rptInsideUpperLeft ].red = 0xDDDD;
- C3DView::gColor [ rstDepressedWhite ] [ rptInsideUpperLeft ].green = 0xDDDD;
- C3DView::gColor [ rstDepressedWhite ] [ rptInsideUpperLeft ].blue = 0xDDDD;
-
- C3DView::gColor [ rstDepressedWhite ] [ rptFill ].red = 0xEEEE;
- C3DView::gColor [ rstDepressedWhite ] [ rptFill ].green = 0xEEEE;
- C3DView::gColor [ rstDepressedWhite ] [ rptFill ].blue = 0xEEEE;
-
- C3DView::gColor [ rstDepressedWhite ] [ rptInsideLowerRight ].red = 0xEEEE;
- C3DView::gColor [ rstDepressedWhite ] [ rptInsideLowerRight ].green = 0xEEEE;
- C3DView::gColor [ rstDepressedWhite ] [ rptInsideLowerRight ].blue = 0xEEEE;
-
- C3DView::gColor [ rstDepressedWhite ] [ rptMiddleLowerRight ].red = 0x8888;
- C3DView::gColor [ rstDepressedWhite ] [ rptMiddleLowerRight ].green = 0x8888;
- C3DView::gColor [ rstDepressedWhite ] [ rptMiddleLowerRight ].blue = 0x8888;
-
- C3DView::gColor [ rstDepressedWhite ] [ rptOutsideLowerRight ].red = 0x5555;
- C3DView::gColor [ rstDepressedWhite ] [ rptOutsideLowerRight ].green = 0x5555;
- C3DView::gColor [ rstDepressedWhite ] [ rptOutsideLowerRight ].blue = 0x5555;
- }
-
- //------------------------------------------------------------------------------
- // C3DView methods
- //------------------------------------------------------------------------------
-
- //------------------------------------------------------------------------------
-
- C3DView::C3DView(E3DState itsInitialState)
- {
- mState = itsInitialState;
- mIsDepressed = kIsNotDepressed;
-
- InitU3DView();
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::Draw3D(const DrawContext * context)
- {
- ASSERT((context != NULL), "NULL draw context!");
-
- PenState savePen;
- ::GetPenState(&savePen);
- ::PenNormal();
-
- if ( CheckScreenDepth(context) > 1 )
- DrawWithDepth ( context );
- else
- DrawWithoutDepth ( context );
-
- SetPenState(&savePen);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::DrawWithDepth(const DrawContext * context)
- {
- ASSERT((context != NULL), "NULL draw context!");
-
- // Currently this method assumes that the "border" that creates the
- // illusion of the 3D relief is two or three pixels wide (depending
- // on how you count).
-
- Rect innerRect;
- RGBColor partColor;
- Rect qdArea = context->Location;
-
- // Fill the rect
-
- GetFillColor(&partColor);
- ::RGBBackColor(&partColor);
- ::SetRect(&innerRect, qdArea.left + 2, qdArea.top + 2, qdArea.right - 3,qdArea.bottom - 3);
- ::EraseRect(&innerRect);
-
- // Draw outside upper-left lines
-
- GetOutsideUpperLeftColor(&partColor);
- ::RGBForeColor(&partColor);
- ::MoveTo(qdArea.left,qdArea.bottom - 1);
- ::LineTo(qdArea.left,qdArea.top);
- ::LineTo(qdArea.right - 1, qdArea.top);
-
- // Draw inside upper-left lines
-
- GetInsideUpperLeftColor(&partColor);
- ::RGBForeColor(&partColor);
- ::MoveTo(qdArea.left + 1,qdArea.bottom - 2);
- ::LineTo(qdArea.left + 1,qdArea.top + 1);
- ::LineTo(qdArea.right - 2,qdArea.top + 1);
-
- // Draw inside lower-right lines
-
- GetInsideLowerRightColor(&partColor);
- ::RGBForeColor(&partColor);
- ::MoveTo(qdArea.left + 2, qdArea.bottom - 3);
- ::LineTo(qdArea.right - 3,qdArea.bottom - 3);
- ::LineTo(qdArea.right - 3,qdArea.top + 2);
-
- // Draw middle lower-right lines
-
- GetMiddleLowerRightColor(&partColor);
- ::RGBForeColor(&partColor);
- ::MoveTo(qdArea.left + 2, qdArea.bottom - 2);
- ::LineTo(qdArea.right - 2, qdArea.bottom - 2);
- ::LineTo(qdArea.right - 2, qdArea.top + 2);
-
- // Draw outer lower-right lines
-
- GetOutsideLowerRightColor(&partColor);
- ::RGBForeColor(&partColor);
- ::MoveTo(qdArea.left + 1,qdArea.bottom - 1);
- ::LineTo(qdArea.right - 1,qdArea.bottom - 1);
- ::LineTo(qdArea.right - 1,qdArea.top + 1);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::DrawWithoutDepth(const DrawContext * context)
- {
- ASSERT((context != NULL), "NULL draw context!");
-
- Rect qdArea = context->Location;
-
- Rect innerRect;
- SetRect(&innerRect, qdArea.left + 2, qdArea.top + 2, qdArea.right - 2, qdArea.bottom - 2);
-
- EraseRect(&qdArea);
-
- if ( GetState() != rstNominal )
- ::InvertRect(&innerRect);
-
- ::FrameRect(&qdArea);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::Invalidate(const DrawContext * context)
- {
- ASSERT((context != NULL), "NULL draw context!");
-
- ::InvalRect(&(context->Location));
- }
-
- //------------------------------------------------------------------------------
-
- short
- C3DView::CheckScreenDepth(const DrawContext * context)
- {
- ASSERT((context != NULL), "NULL draw context!");
-
- short screenDepth = 1;
-
- // Get global rect of our window
-
- GrafPtr savedPort;
- ::GetPort(&savedPort);
- ::SetPort(context->Port);
- Rect globalRect = context->Port->portRect;
- Point topLeft = { globalRect.top, globalRect.left };
- Point bottomRight = { globalRect.bottom, globalRect.right };
- ::LocalToGlobal(&topLeft);
- ::LocalToGlobal(&bottomRight);
- ::SetPort(savedPort);
-
- // Find the deepest GDevice it intersects
-
- GDHandle myGDHandle = ::GetMaxDevice ( &globalRect );
- if ( myGDHandle != NULL )
- screenDepth = (**((**myGDHandle).gdPMap)).pixelSize;
-
- return screenDepth;
- }
-
- //------------------------------------------------------------------------------
-
- E3DState
- C3DView::GetState()
- {
- return mState;
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::SetState(const DrawContext * context, E3DState theState, Boolean redraw)
- {
- if ( theState != mState )
- {
- mState = theState;
-
- mIsDepressed = (mState >= rstDepressed);
-
- if ( redraw )
- Draw3D(context);
- }
- }
-
- //------------------------------------------------------------------------------
-
- Boolean
- C3DView::IsDepressed()
- {
- return mIsDepressed;
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::GetOutsideUpperLeftColor(RGBColor * returnColor)
- {
- ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptOutsideUpperLeft ]), returnColor);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::GetInsideUpperLeftColor(RGBColor * returnColor)
- {
- ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptInsideUpperLeft ]), returnColor);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::GetFillColor(RGBColor * returnColor)
- {
- ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptFill ]), returnColor);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::GetInsideLowerRightColor(RGBColor * returnColor)
- {
- ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptInsideLowerRight ]), returnColor);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::GetMiddleLowerRightColor(RGBColor * returnColor)
- {
- ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptMiddleLowerRight ]), returnColor);
- }
-
- //------------------------------------------------------------------------------
-
- void
- C3DView::GetOutsideLowerRightColor(RGBColor * returnColor)
- {
- ::SetRGBColor(&(C3DView::gColor [ mState ] [ rptOutsideLowerRight ]), returnColor);
- }
-